#include <iostream>
#include "../comm/httplib.h"
#include "oj_control.hpp"

using namespace httplib;
using namespace ns_control;

//ctrl_ptr：一个全局的 Control 类指针，后面在信号处理函数中会用到。
static Control *ctrl_ptr = nullptr;
// void Recovery(int signo)
// {
//     ctrl_ptr->RecoveryMachine();
// }Recovery 函数：这是一个信号处理函数，当服务器收到 SIGQUIT 信号时，
//会调用 Control 类的 RecoveryMachine 函数，用于恢复服务器状态，比如将离线的编译服务器重新上线。

void Recovery(int signo)
{
    ctrl_ptr->RecoveryMachine();
}

int main()
{

    signal(SIGQUIT, Recovery);

    //用户请求的服务路由功能

    //创建一个 Server 实例，httplib 库的 Server 类用于处理 HTTP 请求。
    Server svr;

    // 创建一个 Control 实例，Control 类管理题目数据和用户请求的判题逻辑。
    Control ctrl;

    

    //获取所有的题目列表
    svr.Get("/all_questions", [&ctrl](const Request &req, Response &resp){
        //返回一张包含所有题目的网页
         //resp.set_content("这是所有的额题目列表", "text/plain; charset=utf-8");
        std::string html;              
        ctrl.AllQuestions(&html);
        //用户看到的是什么呢？？网页数据 + 拼上了题目相关的数据
        resp.set_content(html, "text/html; charset=utf-8");

    });

    // 用户要根据题目编号，获取题目的内容
    // /question/100 -> 正则匹配
    // R"()", 原始字符串raw string,保持字符串内容的原貌，不用做相关的转义
    svr.Get(R"(/question/(\d+))", [&ctrl](const Request &req, Response &resp){
        // std::string number = req.matches[1];
        // std::string html;
        // ctrl.Question(number, &html);
        // resp.set_content("这是指定的一道题: " + number, "text/plain; charset=utf-8");

        std::string number = req.matches[1];
        std::string html;
        ctrl.Question(number, &html);
        resp.set_content(html, "text/html; charset=utf-8");
    });

    // 用户提交代码，使用我们的判题功能(1. 每道题的测试用例 2. compile_and_run)
    svr.Post(R"(/judge/(\d+))", [&ctrl](const Request &req, Response &resp){
        std::string number = req.matches[1];
        std::string result_json;
        ctrl.Judge(number, req.body, &result_json);
        resp.set_content(result_json, "application/json;charset=utf-8");
        // resp.set_content("指定题目的判题: " + number, "text/plain; charset=utf-8");
    });

    //这行代码指定了服务器的静态文件根目录。"./wwwroot" 目录下的文件可以被客户端通过 URL 直接访问，如 HTML、CSS、图片等静态资源。
    svr.set_base_dir("/home/ubuntu/load-balancing-online---oj/oj_server/wwwroot");

    //服务器监听 0.0.0.0:8080，即在本地机器的所有网络接口上监听 8080 端口，允许客户端连接到该端口。
    // 这个地址 0.0.0.0 表示接受来自所有网络接口的连接请求，8080 是服务器的端口号。
    svr.listen("0.0.0.0", 8080);

    return 0;
}
